package kr.co.bettersoft.waitnumbercustomer.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.waitnumbercustomer.adapter.MemberStoreReviewListAdapter;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.Merchant;
import kr.co.bettersoft.waitnumbercustomer.domain.WaitingRecommendation;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

/**
 * 가맹점 상세 정보를 확인할 수 있고, 별점을 주지 않았을 경우 별점을 줄 수 있다.
 * @author blue
 *
 */
public class MemberStoreInfoActivity extends Activity{
	String TAG = "MemberStoreInfoPage";

//	final int GET_MERCHANT_INFO = 301; 		// 가맹점 정보 받기 --> 별점 정보 받을때 같이 받는걸로..
	
	final int SELECT_RECOMMENDATION_INFORMATION = 302;
	
	final int SELECT_MERCHANT_RECOMMENDATION_LIST = 303;			// 가맹점 리뷰 리스트 		
	final int SELECT_DUPLICATION_MEMBER_RECOMMENDATION = 304;		// 사용자의 추천 여부 체크
//	final int UPDATE_LOG_TO_SERVER = 302;
	
//	// 내 좌표 업뎃용				///////////////////////////////////////////////
//	String myLat2;
//	String myLon2;
//	// 전번(업뎃용)
//	String phoneNum = "";
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	// qr
	String userId;		// 사용자 아이디
	// 설정 파일 저장소  - 사용자 전번 읽기 / 쓰기 용도	
	SharedPreferences sharedPrefCustom;
	// 중복 실행 방지용
	int isUpdating = 0;
	/////////////////////////////////////////////////////////////////////////////

	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	
	View storeInfoMasterView;		// 전체 - > 한번에 보여주기 위함
	View storeInfoLayout;		// 가맹점 상세 정보 탭
	View reviewListLayout;	// 리뷰 리스트 탭
	RatingBar mRating;			// 별점 레이팅바
	TextView rateText;			// 평점 표시 뷰
	View ratingLayout;		// 레이팅 뷰	
	
	Button registerReviewBtn ;			// 리뷰 등록 버튼
	Button callBtn ;			// 전화걸기 버튼
	Button mapBtn;				// 지도 보기 버튼
//	Button closeBtn;			// 닫기 버튼
//	Button showReviewListBtn;		// 리뷰 보기 버튼
	Button showStoreInfoTabBtn;		// 가맹점 상세 정보 보기 탭 버튼
	Button showReviewListTabBtn;	// 리뷰 리스트 보기 탭 버튼

	TextView member_store_title ;	// 타이틀	
//	TextView phone ;				// 전번
//	TextView pre_phone;				// 전번 앞에 붙이는 전화:
//	TextView addr;					// 주소
	TextView pr;					// 소개글
	
	//리뷰 탭 화면 구성
	View emptyView;
	ListView listView;
	// 진행바
	ProgressBar pbReviewList1;		
	
	int tabMode = 1;		// 1 = 가맹점 정보 탭, 2 = 리뷰 리스트 탭 (플래그)
	
	
	// 서버 통신
//	String certiResult="";
//	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;

	public Merchant merchantData = new Merchant();	// 결과 저장해서 보여주기 위한 도메인.

	String merchantId;
	String imgDomain = CommonConstant.imgDomain; 					// Img 가져올때 파일명만 있을 경우 앞에 붙일 도메인.   // 수정 필요.
	Bitmap bm = null;
	String latitude = "";
	String longitude = "";

	int error=0;
	String tmpstr = "";
	String tmpstr2 = "";
	int maxPRstr = 200;					// 화면에 보여줄 소개 글의 최대 글자수. 넘어가면 자르고 ... 으로 표시해줌.
	Boolean isFirstReview;		// 리뷰 작성 가능 여부 
	Boolean isFirstReviewChecked = false;		// 리뷰 작성했는지 여부를 확인했는지 여부(한번만 확인하도록 하기 위함)
	
	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바

	List<WaitingRecommendation> recommendationEntriesFn;		// 리뷰 리스트 결과
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		// 받아온결과를 화면에 뿌려준다.
				if(b.getInt("showYN")==1){
					// merchantData 에서 데이터 꺼내어 화면에 세팅한다.			// titleImg , name , companyName , phone , addr , pr ,,
					TextView member_store_title = (TextView)findViewById(R.id.member_store_title);
					ImageView titleImg = (ImageView)findViewById(R.id.prImage);
//					TextView name = (TextView)findViewById(R.id.name);	
					hidePb();

					// set the Drawable on the ImageView
					//					titleImg.setImageDrawable(bmpResize);	
					titleImg.setImageBitmap(merchantData.getMerchantImageBmp());		
					latitude = merchantData.getLatitude();
					longitude = merchantData.getLongtitude();
//					tmpstr = getString(R.string.phone_num);
//					phone.setText(merchantData.getWorkPhoneNumber());
//					tmpstr = getString(R.string.addr);
//					addr.setText(tmpstr+""+merchantData.getAddress01());
					//					tmpstr = getString(R.string.pr_str);	// 앞에 소개: 를 붙이지 않음.
					pr.setText(merchantData.getPrSentence());
					member_store_title.setText(merchantData.getCompanyName());			// 상단 타이틀 안에 가맹점 이름.
					//					tmpstr = getString(R.string.shop_name);
					
					mRating.setRating(Float.parseFloat(merchantData.getEvaluationValue())/2); 
					rateText.setText(merchantData.getEvaluationValue()+"  ("+(int)Float.parseFloat(merchantData.getEvaluationCount())+")");
					
					if(merchantData.getWorkPhoneNumber().length()>1){	
//						pre_phone.setVisibility(View.VISIBLE);
//						callBtn.setVisibility(View.VISIBLE);
						callBtn.setEnabled(true);
					}
					if(latitude.length()>3&&longitude.length()>3){
//						mapBtn.setVisibility(View.VISIBLE);  
						mapBtn.setEnabled(true);
					}
					storeInfoMasterView.setVisibility(View.VISIBLE);
//					showReviewListBtn.setVisibility(View.VISIBLE);
//					closeBtn.setVisibility(View.VISIBLE);
					
				}
				if(b.getInt("showReviewYN")==1){
					// 최종 결과 배열은 entriesFn 에 저장되어 있다.. 
					if(recommendationEntriesFn!=null && recommendationEntriesFn.size()>0){
						setListing();
					}else{
						Log.d(TAG,"no data");
						listView.setEmptyView(emptyView);
						listView.setVisibility(View.GONE);			
						emptyView.setVisibility(View.VISIBLE);
					}
				}
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("confirmToCall")==1){					 // 알림 및 경고창 . 
					final String callNum =  b.getString("msg");
					
//					// 메시지 중앙 정렬
//					AlertDialog.Builder builder = new AlertDialog.Builder(returnThis());
//					builder.setTitle(getString(R.string.calling));							
//					builder.setMessage(callNum)
//						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
//						public void onClick(DialogInterface dialog, int whichButton) {
//							startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + callNum)));		// 바로 통화
////							startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));		// 다이얼
////							startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)));		// 통화
//						}})
//						.setNegativeButton(android.R.string.cancel, null);			
//					builder.setIcon(R.drawable.ic_dialog_img);		// 경고창.  
//					AlertDialog alert = builder.create();
//					alert.show();
//					TextView messageView = (TextView)alert.findViewById(android.R.id.message);
//					messageView.setGravity(Gravity.CENTER);
//					TextView titleView = (TextView)alert.findViewById(android.R.id.title);
//					titleView.setGravity(Gravity.CENTER);
					
					// 기본형
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(getString(R.string.calling)+":"+callNum)			
//					.setTitle(getString(R.string.calling))							
//					.setMessage(callNum)			
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + callNum)));		// 바로 통화
//							startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));		// 다이얼
//							startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)));		// 통화
						}})
						.setNegativeButton(android.R.string.cancel, null).show();
				}
				
				if(b.getInt("order")==1){ 		// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){ // 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}else if(b.getInt("order")==3){ 		// 리뷰 프로그래스바 실행
					pbReviewList1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==4){ 		// 리뷰 프로그래스바  종료
					pbReviewList1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MemberStoreInfoActivity.this, R.string.error_message, Toast.LENGTH_SHORT).show();
				}
				
				switch (msg.what)
				{
					// 가맹점 정보 가져오기
					case SELECT_RECOMMENDATION_INFORMATION   : runOnUiThread(new RunnableSelectRecommendationInformation());	
					break;
					// 가맹점 리뷰 보기
					case SELECT_MERCHANT_RECOMMENDATION_LIST  : runOnUiThread(new RunnableSelectMerchantRecommendationList());	
					break;
					// 가맹점 리뷰 작성 여부 확인
					case SELECT_DUPLICATION_MEMBER_RECOMMENDATION  : runOnUiThread(new RunnableSelectDuplicationMemberRecommendation());	
					break;
					default : 
						break;
				}	
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	//////////////////////////////////////////////////////////////////////////////////////////////////////////


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );		// no title
		setContentView(R.layout.member_store_info_activity);

//		WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();	// oncreate

		storeInfoMasterView = (View)findViewById(R.id.store_info_master_view);		// 가맹점 정보 보기 탭
		storeInfoLayout = (View)findViewById(R.id.store_info_layout);		// 가맹점 정보 보기 탭
		reviewListLayout = (View)findViewById(R.id.review_list_layout);		// 리뷰 리스트 보기 탭
		
		listView  = (ListView)findViewById(R.id.listview);					// 리뷰 리스트 뷰
		emptyView = findViewById(R.id.empty1);								// 리뷰 없음 뷰
		
		
		registerReviewBtn = (Button)findViewById(R.id.register_review_btn);
		callBtn = (Button)findViewById(R.id.callBtn);
		mapBtn = (Button)findViewById(R.id.mapBtn);
		showStoreInfoTabBtn = (Button)findViewById(R.id.show_store_info_tab_btn);
		showReviewListTabBtn = (Button)findViewById(R.id.show_review_list_tab_btn);
		ratingLayout = (View)findViewById(R.id.rating_layout); 
		mRating = (RatingBar)findViewById(R.id.rating_bar);
		rateText = (TextView)findViewById(R.id.rate_text);
		member_store_title = (TextView)findViewById(R.id.member_store_title);
		pr = (TextView)findViewById(R.id.pr);
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    member_store_title.setTypeface(typefaceNanumGothic);		// 폰트 적용
	    rateText.setTypeface(typefaceNanumGothic);		 
	    callBtn.setTypeface(typefaceNanumGothic);		 
	    mapBtn.setTypeface(typefaceNanumGothic);		 
	    showStoreInfoTabBtn.setTypeface(typefaceNanumGothic);		 
	    showReviewListTabBtn.setTypeface(typefaceNanumGothic);		 
	    pr.setTypeface(typefaceNanumGothic);		 
		
	    topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		ratingLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {		
				if(isFirstReview){		
					if(merchantData.getMerchantId()!=null && merchantData.getMerchantId().length()>0){
						Intent reviewIntent = new Intent(MemberStoreInfoActivity.this, MemberStoreReviewListActivity.class);	// @@@
						reviewIntent.putExtra("merchantId", merchantData.getMerchantId());
						reviewIntent.putExtra("idRecommendation", merchantData.getIdRecommendation());
						reviewIntent.putExtra("creator", merchantData.getCreator());
						reviewIntent.putExtra("totalEvaluation", merchantData.getEvaluationTotal());
						reviewIntent.putExtra("totalMember", merchantData.getEvaluationCount());
						reviewIntent.putExtra("averageEvaluation", merchantData.getEvaluationValue());
						reviewIntent.putExtra("companyName", merchantData.getCompanyName());
						startActivity(reviewIntent);
					}
				}else{
					showAlert(getString(R.string.already_registered));
				}
			}
		});
		registerReviewBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {
				if(isFirstReview){		
					if(merchantData.getMerchantId()!=null && merchantData.getMerchantId().length()>0){
						Intent reviewIntent = new Intent(MemberStoreInfoActivity.this, MemberStoreReviewListActivity.class);	// @@@
						reviewIntent.putExtra("merchantId", merchantData.getMerchantId());
						reviewIntent.putExtra("idRecommendation", merchantData.getIdRecommendation());
						reviewIntent.putExtra("creator", merchantData.getCreator());
						reviewIntent.putExtra("totalEvaluation", merchantData.getEvaluationTotal());
						reviewIntent.putExtra("totalMember", merchantData.getEvaluationCount());
						reviewIntent.putExtra("averageEvaluation", merchantData.getEvaluationValue());
						reviewIntent.putExtra("companyName", merchantData.getCompanyName());
						startActivity(reviewIntent);
					}
				}else{
					showAlert(getString(R.string.already_registered));
					
//					// test 용임 @@ ## 
//					if(merchantData.getMerchantId()!=null && merchantData.getMerchantId().length()>0){
//						Intent reviewIntent = new Intent(MemberStoreInfoActivity.this, MemberStoreReviewListActivity.class);	// @@@
//						reviewIntent.putExtra("merchantId", merchantData.getMerchantId());
//						reviewIntent.putExtra("idRecommendation", merchantData.getIdRecommendation());
//						reviewIntent.putExtra("creator", merchantData.getCreator());
//						reviewIntent.putExtra("totalEvaluation", merchantData.getEvaluationTotal());
//						reviewIntent.putExtra("totalMember", merchantData.getEvaluationCount());
//						reviewIntent.putExtra("averageEvaluation", merchantData.getEvaluationValue());
//						reviewIntent.putExtra("companyName", merchantData.getCompanyName());
//						startActivity(reviewIntent);
//					}
				}
			}
		});
		callBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {
				setCallingPhoneNumber(merchantData.getWorkPhoneNumber());
			}
		});
		mapBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {

				Log.d(TAG,"latitude:"+latitude+"//longitude:"+longitude);	// *** 

				if(latitude.length()>0 && longitude.length()>0){
					Intent mapIntent = new Intent(MemberStoreInfoActivity.this, MemberStoreMapPageActivity.class);	// @@@ 
					mapIntent.putExtra("latitude", latitude);
					mapIntent.putExtra("longitude", longitude);
					mapIntent.putExtra("companyName", merchantData.getCompanyName());
					mapIntent.putExtra("fullAddress", merchantData.getAddress01());
					startActivity(mapIntent);
				}
			}
		});
//		closeBtn.setOnClickListener(new Button.OnClickListener()  {
//			public void onClick(View v)  {
//				finish();
//			}
//		});	
//		showReviewListBtn.setOnClickListener(new Button.OnClickListener()  {
//			public void onClick(View v)  {
////				Log.d(TAG,"merchantData.getMerchantId():"+merchantData.getMerchantId());
////				Log.d(TAG,"merchantId:"+merchantId);
//				
//				if(merchantData.getMerchantId()!=null && merchantData.getMerchantId().length()>0){
//					Intent reviewIntent = new Intent(MemberStoreInfoActivity.this, MemberStoreReviewListActivity.class);	// @@@
//					reviewIntent.putExtra("merchantId", merchantData.getMerchantId());
//					reviewIntent.putExtra("idRecommendation", merchantData.getIdRecommendation());
//					reviewIntent.putExtra("creator", merchantData.getCreator());
//					reviewIntent.putExtra("totalEvaluation", merchantData.getEvaluationTotal());
//					reviewIntent.putExtra("totalMember", merchantData.getEvaluationCount());
//					reviewIntent.putExtra("averageEvaluation", merchantData.getEvaluationValue());
//					reviewIntent.putExtra("companyName", merchantData.getCompanyName());
//					startActivity(reviewIntent);
//				}
//			}
//		});	

		// 가맹점 정보 보기 탭
		showStoreInfoTabBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {
				showStoreInfoTabBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub5_6_over));
				showReviewListTabBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub5_7));
				tabMode = 1;
				storeInfoLayout.setVisibility(View.VISIBLE);
				reviewListLayout.setVisibility(View.GONE);
			}
		});	
		// 추천평 리스트 보기 탭
		showReviewListTabBtn.setOnClickListener(new Button.OnClickListener()  {
			public void onClick(View v)  {
				showStoreInfoTabBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub5_6));
				showReviewListTabBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub5_7_over));
				if(tabMode == 1){		// 중복 실행 방지
					tabMode = 2;
					storeInfoLayout.setVisibility(View.GONE);
					reviewListLayout.setVisibility(View.VISIBLE);
					
//					if(!isFirstReviewChecked){
//						handler.sendEmptyMessage(SELECT_DUPLICATION_MEMBER_RECOMMENDATION);	// 리뷰 리스트 가져오기 전에 추천여부 부터 확인하고 그 후에 리뷰 리스트를 가져온다.	
//					}else{
						handler.sendEmptyMessage(SELECT_MERCHANT_RECOMMENDATION_LIST);	// 리뷰 리스트 가져온다.	
//					}
					
				}
			}
		});	
		
		// progress bar
		pb1 = (ProgressBar) findViewById(R.id.memberstore_info_ProgressBar01);		// 로딩(중앙)
		pbReviewList1 = (ProgressBar) findViewById(R.id.member_store_review_list_progress_bar);		// 로딩 (리뷰 리스트용) 
		showPb();

		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,				
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		userId = sharedPrefCustom.getString("qrCode", "");	
		if(userId.length()<1){
			Log.d(TAG,"no saved qrCode");
			finish();
		}
		
		// *** 데이터 전달 받기
		Intent gottenIntent = getIntent();
		merchantId = gottenIntent.getStringExtra("merchantId");
		// 어차피 쿼리 한번 돌리면 다 받아짐. 
//		merchantData.setMerchantId(merchantId);
//		merchantData.setCompanyName(gottenIntent.getStringExtra("companyName"));
//		merchantData.setEvaluationCount(gottenIntent.getStringExtra("evaluationCount"));
//		merchantData.setEvaluationValue(gottenIntent.getStringExtra("evaluationValue"));
//		merchantData.setEvaluationTotal(gottenIntent.getStringExtra("evaluationTotal"));
		
		if(isUpdating==0){
//			handler.sendEmptyMessage(GET_MERCHANT_INFO);
			// 리뷰 작성 여부 확인부터 하고 가맹점 정보 가져오도록 한다.
			handler.sendEmptyMessage(SELECT_DUPLICATION_MEMBER_RECOMMENDATION); 		// 			handler.sendEmptyMessage(SELECT_RECOMMENDATION_INFORMATION);

		}
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * setListing
	 *  리스트 보여주고 클릭 이벤트 등록 (가맹점 상세 보기)한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setListing(){
		listView.setAdapter(new MemberStoreReviewListAdapter(this, recommendationEntriesFn));
	}

	
	////////////////////////////////////////////////////////////////////////////////////////////
// 비동기 통신.

//	/**
//	 * 러너블. 가맹점 정보를 가져온다.
//	 */
//	class RunnableGetMerchantInfo implements Runnable {
//		public void run(){
//			new backgroundGetMerchantInfo().execute();
//		}
//	}
//	/**
//	 * 비동기로 가맹점 정보를 가져온다.
//	 * backgroundGetMerchantInfo
//	 */
//	public class backgroundGetMerchantInfo extends  AsyncTask<Void, Void, Void> { 
//		@Override protected void onPostExecute(Void result) {  
//		} 
//		@Override protected void onPreExecute() {  
//		} 
//		@Override protected Void doInBackground(Void... params) {  
//			Log.d(TAG,"backgroundGetMerchantInfo");
//
//			if(isUpdating==0){
//				isUpdating = 1;
//				// 파리미터 세팅
//				Merchant merchantParam = new Merchant();
//				merchantParam.setMerchantId(merchantId);
//
//				// 호출
//				showPb();
////				callResult = waitNumberCustomerRest.RestGetMerchantInfo(merchantParam);		// 미구현 *** 
//				callResult = "F";		// 임시 처리 *** 
//				hidePb();
////				// 결과 처리
////				if(callResult.equals("S")){		
////					processMerchantStoreInfoData();	// 화면에 뿌려준다.	
////				}else{														 
////					showMSG();
////				}
//				
//				
//				
//				
//				// *** 받았다고 치고 하드코딩 데이터로 세팅
//				merchantData.setAddress01(address01);
//				merchantData.setCompanyName(companyName);
//				merchantData.setEvaluationCount(evaluationCount);
//				merchantData.setEvaluationValue(evaluationValue);
//				merchantData.setLatitude(latitude);
//				merchantData.setLongtitude(longtitude);
//				merchantData.setMerchantId(merchantId);
//				merchantData.setMerchantImageUrl(merchantImageUrl);
//				merchantData.setPrStr(prStr);
//				merchantData.setWorkPhoneNumber(workPhoneNumber);
//				BitmapDrawable dw = (BitmapDrawable) returnThis().getResources().getDrawable(R.drawable.sub5_3);
//				bm = dw.getBitmap();
//				merchantData.setMerchantImageBmp(bm);
//				// *** 하드코딩
//				
//				// 별점도 받는다.
//				handler.sendEmptyMessage(SELECT_RECOMMENDATION_INFORMATION);
//				
//				
//				
//				isUpdating = 0;
//			}else{
//				Log.d(TAG,"already updating..");
//			}
//
//			return null; 
//		}
//	}
	
	
	
	/**
	 * 러너블. 가맹점 추천 정보를 가져온다.
	 */
	class RunnableSelectRecommendationInformation implements Runnable {
		public void run(){
			new backgroundSelectRecommendationInformation().execute();
		}
	}
	/**
	 * 비동기로 가맹점 추천 정보를 가져온다.
	 * backgroundSelectRecommendationInformation
	 */
	public class backgroundSelectRecommendationInformation extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSelectRecommendationInformation");
			
			if(isUpdating==0){
				isUpdating = 1;
				// 파리미터 세팅
				Merchant merchantParam = new Merchant();
				merchantParam.setMerchantId(merchantId);
				
				// 호출
				showPb();
				WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
				String callResult = waitNumberCustomerRest.RestSelectRecommendationInformation(merchantParam);		// *** 
				hidePb();
				// 결과 처리
				if(!(callResult.equals("F"))){		
					processMerchantStoreInfoData(callResult);	// 화면에 뿌려준다.			//				showInfo();	 포함
				}else{														 
					showMSG();
				}
				isUpdating = 0;
			}else{
				Log.d(TAG,"already updating..");
			}
			return null; 
		}
	}

	
	/**
	 * 러너블. 가맹점에 대한 리뷰 리스트를 가져온다.		// SELECT_MERCHANT_RECOMMENDATION_LIST  selectMerchantRecommendationList
	 */
	class RunnableSelectMerchantRecommendationList implements Runnable {
		public void run(){
			new backgroundSelectMerchantRecommendationList().execute();
		}
	}
	/**
	 * backgroundSelectMerchantRecommendationList
	 *  비동기로 가맹점에 대한 리뷰 리스트를 가져온다.	
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectMerchantRecommendationList extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectMerchantRecommendationList");
			
			//			// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			waitingRecommendationParam.setMerchantId(merchantId);
			// 호출
			// if(!pullDownRefreshIng){
			showReviewPb();
			// }
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestSelectMerchantRecommendationList(waitingRecommendationParam, returnThis());		
			hideReviewPb();
			
			//			// 결과 처리		 
			if(!(callResult.equals("F"))){ //  성공 	 
					try {
						JSONArray jsonArray2 = new JSONArray(callResult);
						int max = jsonArray2.length();
						try {
							recommendationEntriesFn = new ArrayList<WaitingRecommendation>(max);
							/*
							 * "memberId":"01085858025",
							 * "evaluation":"6",
							 * "content":"ㅊㅋ",
							 * "modifyDate":"2013-07-23 16:44:54",
							 * "registerDate":"2013-07-23 16:44:54",
							 */
							String tmp_memberId = "";
							String tmpstr2 = "";
							String tmp_registerDate = "";
							String tmp_evaluation = "";
							String tmp_content = "";
							if(max>0){
								for ( int i = 0; i < max; i++ ){
									JSONObject jsonObject = jsonArray2.getJSONObject(i);
									//  idCheckMileageMileages,  mileage,  modifyDate,  checkMileageMembersCheckMileageID,  checkMileageMerchantsMerchantID
									// 객체 만들고 값 받은거 넣어서 저장..  저장값: 인덱스번호, 수정날짜, 아이디, 가맹점아이디.
									try{
										tmp_memberId = jsonObject.getString("memberId");
									}catch(Exception e){
										tmp_memberId = "";
									}
									try{
										tmp_registerDate = jsonObject.getString("registerDate");
//										if(tmp_registerDate.length()>9){
//											tmpstr2 = tmp_registerDate.substring(0, 4)+ "-" 		// 년
//											+ tmp_registerDate.substring(5, 7)+ "-" 					// 월
//											+ tmp_registerDate.substring(8, 10) 					// 일
//											;
//											tmp_registerDate = tmpstr2;
//										}
										
										// 원하는 날짜 형식에 맞춰서 데이터 넣기
										int dayOfRegisterDate = 0;	// 오전 오후 분간용
										String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
										String strAMPM = "";
										// 오전 오후 분간하기
										dayOfRegisterDate = Integer.parseInt(tmp_registerDate.substring(11, 13));	// dayOfRegisterDate
										if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
											dayOfRegisterDate = dayOfRegisterDate - 12;
											strAMPM = getString(R.string.pm)+"";
										}else{				// 12시 이전 = 오전
											strAMPM = getString(R.string.am)+"";
										}
										// 두자리로 맞추기.
										dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
										if(dayOfRegisterDate<10){		
											dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
										}
										tmp_registerDate = 
											tmp_registerDate.substring(0, 4)+ getString(R.string.year) 
											+tmp_registerDate.substring(5, 7) + getString(R.string.month) 
											+tmp_registerDate.substring(8, 10) + getString(R.string.day) 
											+ " " + strAMPM + " " 
											+dayOfRegisterDateStr + getString(R.string.hour) 
											+tmp_registerDate.substring(14, 16) + getString(R.string.minute) 
											+tmp_registerDate.substring(17, 19) + getString(R.string.seconds);
										
									}catch(Exception e){
										tmp_registerDate = "";
									}
									try{
//										tmp_evaluation = jsonObject.getString("evaluation");
										tmp_evaluation = (int)Float.parseFloat(jsonObject.getString("evaluation"))+"";	// 소수점 제거
									}catch(Exception e){
										tmp_evaluation = "0";
									}
									try{
										tmp_content = jsonObject.getString("content");
									}catch(Exception e){
										tmp_content = "";
									}
									recommendationEntriesFn.add(new WaitingRecommendation(tmp_memberId,
											tmp_registerDate,
											tmp_evaluation,
											tmp_content
									));
								}
							}
						}catch (JSONException e) {
							e.printStackTrace();
						}
					} catch (JSONException e1) {
						e1.printStackTrace();
					}
			}else{
//				showMSG();
			}
			showReviewInfo();	// 리뷰 보여주기.	// ... @@ 
			
			return null ;
		}
	}
	/**
	 * 러너블. 가맹점에 대한 사용자의 추천 여부를 확인한다. + 끝나면 가맹점 정보가져온다.
	 */
	class RunnableSelectDuplicationMemberRecommendation implements Runnable {
		public void run(){
			new backgroundSelectDuplicationMemberRecommendation().execute();
		}
	}
	/**
	 * backgroundSelectDuplicationMemberRecommendation
	 *  비동기로 가맹점에 대한 사용자의 추천 여부를 확인한다.  + 끝나면 가맹점 정보가져온다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectDuplicationMemberRecommendation extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectDuplicationMemberRecommendation");

			//			// 파리미터 세팅
			WaitingRecommendation waitingRecommendationParam = new WaitingRecommendation();
			waitingRecommendationParam.setMerchantId(merchantId);
			waitingRecommendationParam.setMemberId(userId);
			// 호출
			// if(!pullDownRefreshIng){
			showReviewPb();
			// }
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestSelectDuplicationMemberRecommendation(waitingRecommendationParam);		
//			hideReviewPb();

			//			// 결과 처리		 
			if(callResult.equals("S")){ //  성공, 0		//  || callResult.equals("D")
				isFirstReview = true;
			}else if(callResult.equals("D")){ 					
				isFirstReview = false;
				// 이미 추천하셨습니다.
			}else{
				showMSG();
				isFirstReview = false;
			}
			isFirstReviewChecked = true;	// @@  
			handler.sendEmptyMessage(SELECT_RECOMMENDATION_INFORMATION);		// 가맹점 정보 가져오기

			// handler.sendEmptyMessage(SELECT_MERCHANT_RECOMMENDATION_LIST);	// 리뷰 리스트 가져오기		
			return null ;
		}
	}
	
	////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 서버로부터 받아온 가맹점 정보를 파싱하여 화면에 뿌려준다.
	 */
	public void processMerchantStoreInfoData(String callResult){
		// // // // // // // 바로 바로 화면에 add 하고 터치시 값 가져다가 상세 정보 보도록....
		try {
			JSONObject jsonObject = new JSONObject(callResult);
			String str = "";
			// 데이터를 전역 변수 도메인에 저장하고 핸들러를 통해 도메인-> 화면에 보여준다..
			try{
				merchantData.setIdRecommendation((jsonObject.getString("idRecommendation")));				// 추천 테이블 인덱스
			}catch(Exception e){
				merchantData.setIdRecommendation("");
			}
			try{
				merchantData.setMerchantId(jsonObject.getString("merchantId"));				// 가맹점 아이디
			}catch(Exception e){
				merchantData.setMerchantId("");
			}
			try{
				merchantData.setCreator(jsonObject.getString("creator"));					// 최초 추천자
			}catch(Exception e){
				merchantData.setCreator("");
			}
			try{
				merchantData.setCompanyName(jsonObject.getString("companyName"));			// 가맹점 명	
			}catch(Exception e){
				merchantData.setCompanyName("");
			}
			try{
				merchantData.setMerchantImageUrl(jsonObject.getString("profileImageUrl"));			// 이미지	
			}catch(Exception e){
				merchantData.setMerchantImageUrl("");
			}
			try{
				str = jsonObject.getString("totalEvaluation");
				if(str==null || str.equals("null")){
					str = "0";
				}
				merchantData.setEvaluationTotal(str);			// 총점	
			}catch(Exception e){
				merchantData.setEvaluationTotal("0");
			}
			try{
				str = jsonObject.getString("totalMember");
				if(str==null || str.equals("null")){
					str = "0";
				}
				merchantData.setEvaluationCount(str);			// 추천수	
			}catch(Exception e){
				merchantData.setEvaluationCount("0");
			}
			try{
				str = jsonObject.getString("averageEvaluation");
				if(str==null || str.equals("null")){
					str = "0";
				}
				merchantData.setEvaluationValue(str);			// 평점
			}catch(Exception e){
				merchantData.setEvaluationValue("0");
			}
			try{
				merchantData.setWorkPhoneNumber(jsonObject.getString("workPhoneNumber"));			// 전번	
			}catch(Exception e){
				merchantData.setWorkPhoneNumber("");
			}
			try{
				merchantData.setPrSentence(jsonObject.getString("prSentence"));			// 전번	
			}catch(Exception e){
				merchantData.setPrSentence("");
			}
			try{									
				tmpstr = jsonObject.getString("address01");											// 주소
				tmpstr2 = jsonObject.getString("address02");
				tmpstr = tmpstr + " "+ tmpstr2;
				merchantData.setAddress01(tmpstr);
			}catch(Exception e){
				merchantData.setAddress01("");
			}
			try{
				merchantData.setLatitude(jsonObject.getString("latitude"));			// 위도	
				merchantData.setLongtitude(jsonObject.getString("longitude"));			// 경도		
			}catch(Exception e){
				merchantData.setLatitude("");	
				merchantData.setLongtitude("");	
			}
//			try{
//				prstr = jsonObject.getString("introduction");		// prSentence --> introduction
//				if(prstr.length()>maxPRstr){								
//					prstr = prstr.substring(0, maxPRstr-2) + "...";
//				}
//				merchantData.setPrStr(prstr);			// 설명
//				//					merchantData.setPrSentence(jsonObject.getString("prSentence"));			// 설명
//			}catch(Exception e){
//				merchantData.setPrStr("");
//			}
			// 가맹점 이미지 처리
			if(merchantData.getMerchantImageUrl()!=null && merchantData.getMerchantImageUrl().length()>0){
				try{
					bm = LoadImage(imgDomain+merchantData.getMerchantImageUrl());				 
				}catch(Exception e3){
					Log.w(TAG, imgDomain+merchantData.getMerchantImageUrl()+" -- fail");
					try{
						BitmapDrawable dw = (BitmapDrawable) returnThis().getResources().getDrawable(R.drawable.sub5_3);
						bm = dw.getBitmap();
					}catch(Exception e4){}
				}
			}
			if(bm==null){
				BitmapDrawable dw = (BitmapDrawable) this.getResources().getDrawable(R.drawable.sub5_3);
				bm = dw.getBitmap();
			}
			merchantData.setMerchantImageBmp(bm);
			showInfo();
		} catch (JSONException e) {
			e.printStackTrace();
		} 
	}

	
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  가맹점 이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  가맹점 이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		// TODO Auto-generated method stub
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect() ;
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.w(TAG,"IOException");
		}
		return stream ;
	}


	/*
	 * Bitmap 이미지 리사이즈 -- xml 자체 설정으로 대체
	 * Src : 원본 Bitmap
	 * newHeight : 새로운 높이
	 * newWidth : 새로운 넓이
	 * 참고 소스 : http://skyswim42.egloos.com/3477279 ( webview 에서 capture 화면 resizing 하는 source 도 있음 )
	 */
	private BitmapDrawable BitmapResizePrc(Bitmap Src, float newHeight, float newWidth)
	{
		BitmapDrawable Result = null;
		int width = Src.getWidth();
		int height = Src.getHeight();

		// calculate the scale - in this case = 0.4f
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;

		// createa matrix for the manipulation
		Matrix matrix = new Matrix();

		// resize the bit map
		matrix.postScale(scaleWidth, scaleHeight);

		// rotate the Bitmap 회전 시키려면 주석 해제!
		//matrix.postRotate(45);

		// recreate the new Bitmap
		Bitmap resizedBitmap = Bitmap.createBitmap(Src, 0, 0, width, height, matrix, true);

		// check
		width = resizedBitmap.getWidth();
		height = resizedBitmap.getHeight();
		//		Log.i("ImageResize", "Image Resize Result : " + Boolean.toString((newHeight==height)&&(newWidth==width)) );

		// make a Drawable from Bitmap to allow to set the BitMap
		// to the ImageView, ImageButton or what ever
		Result = new BitmapDrawable(resizedBitmap);
		return Result;
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////
	// 기타 기능


	// 전화 걸기
	/**
	 * setCallingPhoneNumber
	 *  전화를 건다
	 *
	 * @param phoneNumber
	 * @param
	 * @return
	 */
	public void setCallingPhoneNumber(final String phoneNumber) {
		handler.post(new Runnable() {
			public void run() {
				// TODO Auto-generated method stub
				Log.d(TAG, "Received phoneNumber: " + phoneNumber);
				if(("").equals(phoneNumber)) {
					Toast.makeText(MemberStoreInfoActivity.this, R.string.no_phone_num, Toast.LENGTH_SHORT).show();
				} else {
					Log.d(TAG, "Calling Phone.");
					confirmToCall(phoneNumber);
					
//					startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber)));							// 다이얼
//					startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)));		// 통화
				}
			}

		});
	}


	////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸

	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}
	/**
	 * showMSG
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showMSG(){			// 화면에 error 토스트 띄움..
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showErrToast", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 

	/**
	 * showAlert
	 * 얼럿창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showAlert(final String msg){
		MemberStoreInfoActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	/**
	 * confirmToCall
	 *  전화걸지 확인받기
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void confirmToCall(final String msg){
		MemberStoreInfoActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("confirmToCall", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showReviewPb
	 *  리뷰용 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showReviewPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 3);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hideReviewPb
	 *  리뷰용 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hideReviewPb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 4);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

	// 화면에 보여준다..
	/**
	 * showInfo
	 *  받아온 정보를 화면에 보여준다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showReviewInfo
	 *  받아온 정보를 화면에 보여준다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showReviewInfo(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showReviewYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////
}